#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_pwm.h"

#define LED_BLUE   HI_GPIO_IDX_8   // Blue 
#define LED_RED    HI_GPIO_IDX_2   // Red
#define LED_GREEN  HI_GPIO_IDX_7   // Green

#define PWM_DUTY_UP   0
#define PWM_DUTY_DOWN 1

// 控制单个 LED 灯从灭到亮再到灭循环指定次数
static void ControlSingleLed(int ledPin, int pwmPort, int loopCount) {
    int dutyValue = 0; // 0-100
    int dutyFlag = PWM_DUTY_UP; // up or down

    IoTGpioInit(ledPin);
    switch (ledPin) {
        case LED_BLUE:
            hi_io_set_func(ledPin, HI_IO_FUNC_GPIO_8_PWM1_OUT);
            break;
        case LED_RED:
            hi_io_set_func(ledPin, HI_IO_FUNC_GPIO_2_PWM2_OUT); // 假设红色 LED 对应的 PWM 功能
            break;
        case LED_GREEN:
            hi_io_set_func(ledPin, HI_IO_FUNC_GPIO_7_PWM0_OUT); // 假设绿色 LED 对应的 PWM 功能
            break;
        default:
            break;
    }
    IoTGpioSetDir(ledPin, IOT_GPIO_DIR_OUT);

    IoTPwmInit(pwmPort);

    for (int i = 0; i < loopCount; i++) {
        dutyValue = 0;
        dutyFlag = PWM_DUTY_UP;
        while (1) {
            if (dutyFlag == PWM_DUTY_UP) {
                dutyValue++;
            } else {
                dutyValue--;
            }

            if (dutyValue >= 100) {
                printf("Led On to Off\r\n");
                dutyFlag = PWM_DUTY_DOWN;
            }

            if (dutyValue <= 0) {
                printf("Led Off to On\r\n");
                if (i == loopCount - 1) {
                    break;
                }
                dutyFlag = PWM_DUTY_UP;
            }

            IoTPwmStart(pwmPort, dutyValue, 40000);

            osDelay(3);
        }
    }
}

static void LedPwmMain(void) {
    // 按照 RGB 的顺序依次控制 LED 灯
    ControlSingleLed(LED_RED, HI_PWM_PORT_PWM2, 1); // 假设红色 LED 对应的 PWM 端口
    ControlSingleLed(LED_GREEN, HI_PWM_PORT_PWM0, 1); // 假设绿色 LED 对应的 PWM 端口
    ControlSingleLed(LED_BLUE, HI_PWM_PORT_PWM1, 1);
    ControlSingleLed(LED_RED, HI_PWM_PORT_PWM2, 1); // 假设红色 LED 对应的 PWM 端口
    ControlSingleLed(LED_GREEN, HI_PWM_PORT_PWM0, 1); // 假设绿色 LED 对应的 PWM 端口
    ControlSingleLed(LED_BLUE, HI_PWM_PORT_PWM1, 1);
    ControlSingleLed(LED_RED, HI_PWM_PORT_PWM2, 1); // 假设红色 LED 对应的 PWM 端口
    ControlSingleLed(LED_GREEN, HI_PWM_PORT_PWM0, 1); // 假设绿色 LED 对应的 PWM 端口
    ControlSingleLed(LED_BLUE, HI_PWM_PORT_PWM1, 1);

    return;
}

SYS_RUN(LedPwmMain);